package com.kgame5.xtank3d.script {
import kgame5.enginex.EntityVO;
import kgame5.kutil.KEvent;
import kgame5.kutil.T;

import com.kgame5.xtank3d.GameEnum;
import com.kgame5.xtank3d.vo.MyTankVO;
import com.kgame5.xtank3d.vo.level.BornPosiVO;
import com.kgame5.xtank3d.vo.level.CorpsVO;
import com.kgame5.xtank3d.vo.level.LevelVO;
import com.kgame5.xtank3d.vo.level.TankBornVO;

import flash.events.EventDispatcher;
import flash.events.TimerEvent;
import flash.utils.Timer;

/**
 * @author kk
 * 管理关卡数据的
 * 加载关卡数据？
 * LevelManager可以作为proxy.
 * 表扬：这个LevleManager很有气氛!
 */
public class LevelManager extends EventDispatcher{
	
	public static const 
		EVENTTYPE_NEW_CORPS:String="EVENTTYPE_NEW_CORPS",//新兵团出现
		EVENTTYPE_ADD_NPCTANK:String="EVENTTYPE_ADD_NPCTANK",//出现新坦克
		EVENTTYPE_MISSION_COMPLETE:String="EVENTTYPE_MISSION_COMPLETE";//全灭敌人
	
	private var timer:Timer;
	
	private var vo:LevelVO;
	
	public function LevelManager(vo:LevelVO){
		this.vo=vo;
		timer=new Timer(1000,1);
		timer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimer);
	}
	
	public function getLevelVO():LevelVO{
		return vo;
	}
	
	private function onTimer(e:TimerEvent):void{
		T.p("出现一个坦克onTimer");
		//当前坦克出现
		this.dispatchEvent(new KEvent(EVENTTYPE_ADD_NPCTANK,createNPCTankVO(curTankVO)));
		
		//步进
		vo.curTankIdx++;
		if(vo.curTankIdx>curCorpsVO.arrTank.length-1){//一个军团出兵完毕
			T.p("------------军团出现完毕");
		}else{
			//启动timer,准备下一次
			this.prepareNext();
		}
	}
	
	//接收到的坦克死亡的通知
	public function onTankDie(tankVO:MyTankVO):void{
		T.p("------------onTankDie");
		if(tankVO.teamID==GameEnum.TEAM_B){
			
			curCorpsVO.dieCount++;
			if(curCorpsVO.dieCount==curCorpsVO.arrTank.length){//军团消灭
				vo.curCorpIdx++;
				if(vo.curCorpIdx>vo.arrCorps.length-1){//整体结束
					T.p("敌兵出现全部完毕");
					timer.stop();
					
					this.dispatchEvent(new KEvent(EVENTTYPE_MISSION_COMPLETE));
				}else{//切换到新兵团
					startNewCorps();
				}
			}
		}
	}
	
	private var curTankVO:TankBornVO;
	private var curCorpsVO:CorpsVO;
	public function start():void{
		T.p("--LevelManager.start");
		
		vo.curCorpIdx=0;
		
		//关闭这个可以停止敌兵出现
		startNewCorps();
	}
	//注意，这个不清楚是否会正常执行
	public function dispose():void{
		timer.stop();
		timer=null;
	}
	
	private function startNewCorps():void{
		T.p("--------------startNewCorps()");
		vo.curTankIdx=0;
		
		prepareNext();
		
		//发事件说有新兵团出现
		this.dispatchEvent(new KEvent(EVENTTYPE_NEW_CORPS,curCorpsVO));
	}
	
	private function prepareNext():void{
		curCorpsVO=this.findCorps(vo.curCorpIdx);
		curTankVO=this.findTankBornVO(vo.curCorpIdx, vo.curTankIdx);
		
		if(curTankVO.bornTimeGap==0){
			this.onTimer(null);
		}else{
			timer.stop();
			timer.delay=curTankVO.bornTimeGap*1000;
			timer.start();
		}
	}
	
	
	
	private function findCorps(idx:int):CorpsVO{
		return vo.arrCorps[idx] as CorpsVO;
	}
	
	private function findTankBornVO(corpsIdx:int,tankIdx:int):TankBornVO{
		return findCorps(corpsIdx).arrTank[tankIdx] as TankBornVO;
	}
	
	//根据TankBornVO生成MyTankVO
	private function createNPCTankVO(bornVO:TankBornVO):MyTankVO{
		var tankVO:MyTankVO=new MyTankVO();
		
		tankVO.ai = vo._metaConfigVO.dict_aiDef[bornVO.aiMetaID];
		tankVO.body = vo._metaConfigVO.dict_bodyDef[bornVO.bodyMetaID];
		
		var posiVO:BornPosiVO = vo._mapVO.arrTeamBPosi[bornVO.bornPosiID];
		tankVO.hardVO.v3d_p.x=posiVO.x;
		tankVO.hardVO.v3d_p.z=posiVO.z;
		tankVO.hardVO.v3d_r.y=posiVO.rotY;
		
		tankVO.hardVO.aabb.fill(tankVO.body._A, tankVO.body._B, tankVO.body._H2);
		tankVO.hardVO.bball.R=tankVO.body._R;
		
		//身份识别数据
		tankVO.id=EntityVO.GetNextFreeID();
		tankVO.cateID=GameEnum.CATEID_TANK;
		tankVO.typeID=bornVO.bodyMetaID;//加载模型
		tankVO.teamID=GameEnum.TEAM_B;
		
		tankVO.hp= tankVO.body.HP;
		
		
		//tank.name="coco_"+tankVO.id;
		return tankVO;
	}
	
	//生成自己坦克
	public function createMyTankVO(typeID:int):MyTankVO{
		var tankVO:MyTankVO=new MyTankVO();
		//tankVO.ai = vo._metaConfigVO.dict_aiDef[bornVO.aiMetaID];
		tankVO.body = vo._metaConfigVO.dict_bodyDef[typeID];
		
		var posiVO:BornPosiVO = vo._mapVO.teamAPosi;
		tankVO.hardVO.v3d_p.x=posiVO.x;
		tankVO.hardVO.v3d_p.z=posiVO.z;
		tankVO.hardVO.v3d_r.y=posiVO.rotY;
		
		tankVO.hardVO.aabb.fill(tankVO.body._A, tankVO.body._B, tankVO.body._H2);
		tankVO.hardVO.bball.R=tankVO.body._R;
		
		//身份识别数据
		tankVO.id=EntityVO.GetNextFreeID();
		tankVO.cateID=GameEnum.CATEID_TANK;
		tankVO.typeID=typeID;
		tankVO.teamID=GameEnum.TEAM_A;
		
		tankVO.hp= tankVO.body.HP;
		
		return tankVO;
	}
}//end of class
}
